﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using HtmlAgilityPack;

namespace OrderAggregator.InputFormats.HyperNovosib
{
    /// <summary>
    /// Парсер заявок от Гипермаркет Новосибирск
    /// </summary>
    public class HyperNovosibFormat : BaseOrderFormat
    {
        public readonly static HyperNovosibFormat Instance = new HyperNovosibFormat();

        private HyperNovosibFormat()
        {
        }
       
        /// <summary>
        /// Parse
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="getStream"></param>
        /// <returns></returns>
        public override BaseOrder Parse(string filePath, Func<System.IO.Stream> getStream)
        {
            if (!string.Equals(System.IO.Path.GetExtension(filePath), dotHTM, StringComparison.InvariantCultureIgnoreCase))
            {
                return null;
            }


            string content;
            using (var reader = new StreamReader(getStream(), Encoding.Default))
            {
                content = reader.ReadToEnd();
            }
            content = content.Replace("</br>", string.Empty);
            
            var doc = new HtmlDocument();
            doc.LoadHtml(content);
            
            var docNode = doc.DocumentNode;

            var body = docNode.Descendants("body").FirstOrDefault();
            var tables = body.Elements("table");

            string number = string.Empty;
            DateTime date = DateTime.MinValue;
            string client = string.Empty;
            HtmlNode tableData = null;
            
            var countField = 0;

            #region считываем значения с шапки и выделяем таблицу с данными

            foreach (var table in tables)
            {
                if (countField == 3 && tableData != null)
                {
                    break;
                }

                var rowTags = table.Elements("tr").ToArray();
                for (int i = 0; i < rowTags.Length; i++)
                {
                    var tr = rowTags[i];
                    var tdTags = tr.Elements("td").ToArray();

                    if (tdTags.Length > 1 && tdTags.Length < 10)
                    {
                        #region//считываем значения из шапки

                        switch (tdTags[1].InnerText.ToUpper())
                        {
                            case "КОД. НОМЕР:":

                                if (tdTags.Length > 3)
                                {
                                    number = tdTags[3].InnerText;
                                    countField++;
                                }
                                break;

                            case "ДАТА, ВРЕМЯ ПОСТАВКИ:":

                                if (DateTime.TryParse(tdTags[3].InnerText, out date))
                                {
                                    countField++;
                                }
                                break;

                            case "НАИМЕНОВАНИЕ ПОСТАВЩИКА:":

                                if (tdTags.Length > 4 && tdTags[4].InnerText.Contains("Адрес получателя"))
                                {
                                    var tdTagsNext = rowTags[++i].Elements("td").ToArray();
                                    if (tdTagsNext.Length > 4)
                                    {
                                        client = tdTagsNext[4].InnerText;
                                        countField++;
                                    }
                                }
                                break;

                            default: break;
                        }

                        #endregion
                    }
                    else
                    {
                        if (tdTags.Length > 15 && (tdTags[0].InnerText.Contains("№ п/п")))
                        {
                            tableData = table;
                            break;
                        }
                    }
                }
            }

            #endregion
                       
            if (countField < 3 || tableData == null)                
            {                
                return null;
            }

            var rowTagsData = tableData.Elements("tr").ToArray();

            if (rowTagsData.Length <= 1)
            {
                return null;
            }            
          
            var order = new BaseOrder();
            order.Id = number;
            order.Client = client;
            order.ReceiveTime = date;

            for (int i = 1; i < rowTagsData.Length; i++)
            {
                var tr = rowTagsData[i];

                var orderRow = new BaseOrderRow();

                var tdTags = tr.Elements("td").ToArray();

                orderRow.ProductCode = tdTags[2].InnerText;
                orderRow.ProductName = tdTags[6].InnerText;                
                orderRow.Count = decimal.Parse(tdTags[8].InnerText, BaseOrderFormat.RuCulture);
                orderRow.UnitName = tdTags[10].InnerText;

                order.OrderRows.Add(orderRow);
            }

            return order;
        }
    }
}
